<?php

namespace common\models;

use Yii;
use yii\helpers\ArrayHelper;

/**
 * This is the model class for table "Tag".
 */
class Tag extends ActiveRecord {

    // only define rules for those attributes that
    // will receive user inputs.
    public function rules()
    {
        return [[['title'], 'required']];
    }
    /**
     * @name 字段名称
     * @return array
     */
    public function attributeLabels()
    {
        return [
            'title' => '标签名',
        ];
    }

    // @name 保存标签串、相关配置等
    // @param $modelId int 文章编号
    // @param $tags string 标签串
    // @param $model object 关联Model类
    // @return boolean
    public static function updateRelateTags($modelId, $tags, $idKey, $model)
    {
        // 如果不存在标签，删除所有当前文章已存在的文章标签
        if( ! $tags) {
            return $model->deleteAll([$idKey => $modelId]);
        }
        // 文章当前存在的标签，以及更新后的标签，对比判断 添加/删除
        else {
            // 更新标签
            $hasTags = Tag::updateTags($tags);
            // 获取文章已存在的标签
            $modelTags = ArrayHelper::map($model->find()->select(['id', 'tag_id'])->where([$idKey => $modelId])->asArray()->all(), 'tag_id', 'id');
            // echo 'modelTags: '; Yii::$app->controller->v($modelTags);
            foreach($modelTags as $tagId => $modelTagId) {
                // 如果已存在的标签中存在 新标签，剔除
                // echo 'isset '.$modelTagId.': '; Yii::$app->controller->v(isset($hasTags[$tagId]));
                if(isset($hasTags[$tagId])) {
                    unset($hasTags[$tagId]);
                    unset($modelTags[$tagId]);
                }
            }
            // echo 'hasTags: '; Yii::$app->controller->v($hasTags);
            // echo 'modelTags: '; Yii::$app->controller->v($modelTags); die;
            // 把文章已存在的标签中，没有剔除的全部删除
            if(count($modelTags)) {
                if($model->deleteAll(['id' => $modelTags])) {
                    return false;
                }
            }
            // 把新标签关联到文章
            if($hasTags) {
                // 批量添加数据
                foreach($hasTags as $tagId => $tag) {
                    $params[] = [$modelId, $tagId];
                }
                return Yii::$app->db->createCommand()->batchInsert($model->tableName(), [$idKey, 'tag_id'], $params)->execute();
            }
        }
        return true;
    }
    
    // @name 更新标签库
    // @describe 如果标签不存在，添加标签
    // @param $tags array 标签串
    // @return array [标签 => id]
    public static function updateTags($tags)
    {
        $tagModel = new Tag();
        $tags = explode(';', $tags);
        // 判断数据库中是否存在标签
        $hasTags = ArrayHelper::map(Tag::find()->where(['title' => $tags])->asArray()->all(), 'title', 'id');
        // Yii::$app->controller->v($hasTags); die;
        foreach($tags as $tag) {
            if( ! $tag || mb_strlen($tag) > 6) {
                continue;
            }
            // 如果不存在， 添加
            if( ! isset($hasTags[$tag])) {
                $tagModel->isNewRecord = true;
                $tagModel->setAttributes(['title' => $tag]) ;
                $tagModel->save();
                $hasTags[$tag] = $tagModel->id;
                $tagModel->id = null;
            }
        }
        // 初始化返回参数
        return array_flip($hasTags);
    }
}